#include <iostream>
#include <vector>
#include "GrupoFiguras.h"
#include "ExcepcionSVG.h"
using namespace std;

//si alguna de las figuras del vector esta agrupada lanzas error NoValido
GrupoFiguras::GrupoFiguras(const vector<Figura2D*>& figura,string descr)
{
	descripcion = descr;
	for (int i = 0; i < (int)figura.size(); i++)
	{
		if (!(figura[i]->esAgrupada()))
		{
			figs.push_back(figura[i]);
			figs.back()->setAgrupada(true);
		}
		else
		{
			throw ExcepcionValorNoValido(i,"esta figura ya esta agrupada");
		}
	}
}

Figura2D&
GrupoFiguras::getFigura(int pos) const
{
	Figura2D* m=NULL;
	
	if (pos-1<(int)figs.size())
	{
		m=figs[pos-1];			
	}
	
	return *m;	
}

GrupoFiguras::GrupoFiguras(const GrupoFiguras& gf)
{
	//gf.pintar(cout); gf tiene figuras
	Figura2D* aux;
    if (this!=&gf)
    {
        descripcion=gf.descripcion; 
        for (int i = 0; i < (int)gf.figs.size(); i++)
        {
			
			if(dynamic_cast<Rectangulo*> (gf.figs[i]) )
			{
				aux=((Rectangulo*)gf.figs[i])->clonar();	
			}
			else if (dynamic_cast<Circulo*> (gf.figs[i] ))
			{
				aux=((Circulo*)gf.figs[i])->clonar();
			}
			figs.push_back(aux);
			figs[i]->setAgrupada(true);
        }
    }
}

GrupoFiguras::~GrupoFiguras()
{
	descripcion = "";
	if(figs.size()>0)
	{
		for(int i=0;i<(int)figs.size();i++)
		{
			figs[i]->setAgrupada(false);
		}
	}
	figs.clear();
}

void 
GrupoFiguras::pintar(ostream & os)const{
	os<<"<g>"<<endl;
	os<<"<desc>"<<descripcion<<"</desc>"<<endl;
	for(int i = 0;i<(int)figs.size();i++)
	{
		figs[i]->pintar(os);
		os<<endl;
	}
	os<<"</g>"<<endl;
}

bool 
GrupoFiguras::puedoPintarme()const
{
	bool pintar = false;
	
	for (int i = 0; i < (int)figs.size(); i++)
	{
		if (figs[i]->esAgrupada())
		{
			pintar=true;
		}
	}
	return pintar;
}

void 
GrupoFiguras::ocultar(bool ocult)
{
	bool pintar = false;
	
	for (int i = 0; i < (int)figs.size(); i++)
	{
		figs[i]->ocultar(ocult);
	}
}

bool
GrupoFiguras::isOculto() const
{
	return figs[0]->isOculto();
}

void 
GrupoFiguras::leeEntrada(istream & is)
{
	//nu se que pinta esto aqui ^^u
}

Coordenada 
GrupoFiguras::mover(const Coordenada& c)
{
	Coordenada anterior=figs[0]->mover(c);
	Coordenada dif=c-anterior;
	for (int i = 1; i < (int)figs.size(); i++)
	{
		figs[i]->mover(figs[i]->getOrigen()+dif);			
	}
	return anterior;
	
}

Coordenada
GrupoFiguras::getOrigen()const
{	
	Coordenada p;
	if((int)figs.size() >= 0) 
	{
		p=figs[0] -> getOrigen();	
	}
	return p;
}

void
GrupoFiguras::escalar(float porcentaje)
{
	for(int i = 0;i<(int)figs.size();i++)
	{
		figs[i]->escalar(porcentaje);
	}
}

GrupoFiguras*
GrupoFiguras::clonar() const
{
	return new GrupoFiguras(*this);
}

GrupoFiguras*
GrupoFiguras::duplicar(const Coordenada& nuevoOrigen)
{
	
    GrupoFiguras *gf = this->clonar();
	/*for (int i = 0; i < (int)gf->figs.size(); i++)
	{
		cout<<gf->figs[i]<<" ";
	}cout<<endl;*/
    gf->mover(nuevoOrigen);
	/*	for (int i = 0; i < (int)gf->figs.size(); i++)
	{
		cout<<gf->figs[i]<<" ";
	}cout<<endl;*/
    return gf;
}
